// Keywords: identity by state, uniquing, unique down, back mutation, two alleles

initialize() {
	// an m2 mutation is "A"
	initializeMutationType("m2", 0.5, "f", 0.0);
	m2.convertToSubstitution = F;
	m2.color = "red";
	
	// an m3 mutation is "a"
	initializeMutationType("m3", 0.5, "f", 0.0);
	m3.convertToSubstitution = F;
	m3.color = "cornflowerblue";
	
	// enforce mutually exclusive replacement
	c(m2,m3).mutationStackGroup = 1;
	c(m2,m3).mutationStackPolicy = 'l';
	
	initializeGenomicElementType("g1", c(m2,m3), c(1.0,1.0));
	initializeGenomicElement(g1, 0, 99);
	initializeMutationRate(1e-4);
	initializeRecombinationRate(0.5);
}
1 early() {
	sim.addSubpop("p1", 100);
	
	// create the canonical mutation objects
	target = p1.genomes[0];
	target.addNewDrawnMutation(m2, 0:99);
	defineConstant("MUT2", target.mutations);
	target.removeMutations();
	target.addNewDrawnMutation(m3, 0:99);
	defineConstant("MUT3", target.mutations);
	target.removeMutations();
	
	// start homozygous "aa" at every position
	p1.genomes.addMutations(MUT3);
	
	// log results
	log = community.createLogFile("freq.csv", logInterval=10);
	log.addTick();
	log.addMeanSDColumns("freq", "sim.mutationFrequencies(NULL, MUT2);");
}
mutation(m2) {
	// unique down to the canonical m2 mutation
	return MUT2[mut.position];
}
mutation(m3) {
	// unique down to the canonical m3 mutation
	return MUT3[mut.position];
}
50000 late() { }
